1 Password ワンタイムパスワードを使った Assume Role をCLIだけで完結するようにしてみた
西田@大阪です
MFA が設定されている IAM Role に assume role する際に、ワンタイムパスワードを毎回入力するのは面倒ですよね。
以下のブログを参考に、 assume role する際に 1 Password からワンタイムパスワードを取得し、assume role コマンドのパラメーターに設定するシェルを作成しました
上記のブログにあります、以下が前提条件となります
- 1Password の CLI Toolがインストールされている
- fzf がインストールされている
シェルスクリプト
ベースは上記で紹介されたシェルスクリプトをもとに以下の変更をさせていただいてます
- 1 Password CLI で
signin
を行います。signin
の実行結果にセッションのトークンが含まれるのでeval
すると環境変数にexportされるため、しばらくパスワードを入力しなくてもいいようにしています - 1 Passwrod CLI でワンタイムパスワードを取得し、それを
assume-role
のパラメーターに指定しています
#!/bin/bash SERIAL_NUMBER='arn:aws:iam::${YOUR_AWS_COUNT_ID}:mfa/${YOUR_NAME}' SOURCE_PROFILE='${YOUR_SOURCE_AWS_PROFILE}' DATE=`date +%s` DOMAIN='your.1Password.domain' ITEM_NAME='YOUR 1Password Item Name' PROFILE=`grep -oP '\[profile *\K[-\w]+' ~/.aws/config | fzf` if [ "$PROFILE" = "" ]; then return 1 fi TOKEN_CODE=`op get totp '${ITEM_NAME}'` if [ $? != 0 ]; then eval $(op signin ${DOMAIN}) TOKEN_CODE=`op get totp '${ITEM_NAME}'` fi ROLE_ARN=`aws configure get role_arn --profile $PROFILE` OUTPUT=`aws sts assume-role \ --role-arn ${ROLE_ARN} \ --serial-number ${SERIAL_NUMBER} \ --role-session-name ${DATE}-session \ --profile ${SOURCE_PROFILE} \ --duration-second 3600 \ --token-code ${TOKEN_CODE} ` export AWS_ACCESS_KEY_ID=`echo $OUTPUT | jq -r .Credentials.AccessKeyId` export AWS_SECRET_ACCESS_KEY=`echo $OUTPUT | jq -r .Credentials.SecretAccessKey` export AWS_SESSION_TOKEN=`echo $OUTPUT | jq -r .Credentials.SessionToken` echo ""
筆者はfishを使っているので fishから bass を使って上記bashを呼べる設定をしてつかっております
参考: edc/bass: Make Bash utilities usable in Fish shell
config.fish
alias assume='bass source ~/bin/assumer.sh'
動作イメージ
コマンドを実行すると以下のように 1Password のパスワードを聞かれるので、パスワードを入力すれば assume role が完了します
さいごに
ちょっとした小ネタですが、この記事が誰かの参考になれば幸いです